package com.learning.spring.ioc.property.security;

import com.google.common.collect.Lists;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import java.util.List;
import java.util.Properties;

/**
 * ClassName: SecurityPropertiesPlaceHolderConfigurer
 * Description: 自定义的加密属性处理器
 * Date: 2018/8/7 16:45 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class SecurityPropertiesPlaceHolderConfigurer extends PropertyPlaceholderConfigurer {

    /**
     * 约定加密的属性名称
     */
    private List<String> encryptPropName = Lists.newArrayList("user.security.name");

    /**
     * 在加载属性文件并读取文件中的每个属性时，都会调用此方法进行转换处理
     *
     * @param propertyName
     * @param propertyValue
     * @return
     */
    @Override
    protected String convertProperty(String propertyName, String propertyValue) {
        // 判断属性是否是需要加密的
        if (encryptPropName.contains(propertyName)) {
            return this.convertPropertyValue(propertyValue);
        }
        return propertyValue;
    }

    /**
     * 与 convertProperty(String propertyName, String propertyValue) 方法类似，只是没有属性名
     *
     * @param originalValue
     * @return
     */
    @Override
    protected String convertPropertyValue(String originalValue) {
        // 属性解密，略
        String decrypt = DesUtil.decrypt(originalValue);
        return super.convertPropertyValue(decrypt);
    }

    /**
     * 属性文件中所有的属性值都被封装在 props 中，覆盖此方法，可以对所有的属性值进行转换处理
     *
     * @param props
     */
    @Override
    protected void convertProperties(Properties props) {
        super.convertProperties(props);
    }
}